package com.info.dal;

import com.info.DBUtil.SQLHelper;
import com.info.idal.IUserDAL;
import com.info.model.UserInfo;

import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;

//用户接口实现方法
public class UserDAL implements IUserDAL {

    /**
     * 用户登录方法
     * 输入参数：用户名和密码（用对象进行传递）
     * */
    @Override
    public UserInfo validateUserLogin(UserInfo userInfo) {
        //定义SQL语句
        String sql = "SELECT usertb.user_id,usertb.username,roletb.rolename FROM usertb,roletb,user_role_rel\n" +
                "WHERE usertb.user_id = user_role_rel.user_id AND roletb.role_id = user_role_rel.role_id\n" +
                "and usertb.username = ? AND usertb.userpass = ?;";
        //创建对象数组用来存放我们使用的参数
        Object[] param = new Object[]{userInfo.getUsername(),userInfo.getUserpass()};
        try{
            //创建结果集接收数据库操作类的查询结果
            ResultSet rs = SQLHelper.ExecuteReader(sql,param);
            if(rs.next()){
                UserInfo user = new UserInfo();
                user.setUser_id(rs.getInt("user_id"));
                user.setUsername(rs.getString("username"));
                user.setRolename(rs.getString("rolename"));

                return user;
            }
        }catch (SQLException e){
            System.out.println(e);
        }

        return null;
    }

    /**
     * 用户注册方法
     * 输入用户名和密码
     * @return 返回添加成功后的主键id，大于0添加成功
     * */
    @Override
    public Integer adduser(UserInfo userInfo) {
        //定义添加用户的sql语句
        String sql = "insert into usertb(username,userpass)values(?,?)";
        //创建对象数组用来存放我们使用的参数
        Object[] param = new Object[]{userInfo.getUsername(),userInfo.getUserpass()};
        try{
            //新建变量返回是newId
            Integer newId = SQLHelper.ExecuteUpdateReturnNewId(sql,param);
            return newId;

        }catch (SQLException e){
            System.out.println(e);
        }
        return 0;
    }

    /**
     * 根据添加新用户返回的主键id，添加关系表数据
     * 输入参数：用户id和默认的角色id
     * @return 返回受影响的行
     * */
    @Override
    public Integer addUserRoleRelationShip(UserInfo userInfo) {
        //添加关系表数据sql
        String sql = "insert into user_role_rel(role_id,user_id)values(?,?)";

        Object[] param = new Object[]{userInfo.getRole_id(),userInfo.getUser_id()};

        try{
            Integer count = SQLHelper.ExecuteUpdate(sql,param);
            return count;
        }catch (SQLException e){
            System.out.println(e);
        }

        return 0;
    }

    /**
     * 用户注册判断用户名是否已经存在
     * 输入用户
     * */
    @Override
    public boolean validateUserIsExist(UserInfo userInfo) {
        //验证用户名是否存在的sql语句
        String sql = "select * from usertb where username=?";
        //定义参数列表
        Object[] param = new Object[]{userInfo.getUsername()};

        try{
            //执行查询操作
            ResultSet rs = SQLHelper.ExecuteReader(sql,param);
            if(rs.next()){
                //已经存在该用户名的数据
                System.out.println("用户已存在");
                return true;
            }else {
                //不存在该用户名的数据
                System.out.println("用户不存在");
                return false;
            }
        }catch (SQLException e){
            System.out.println(e);
        }

        return false;
    }

    /**
     * 查询所有用户信息
     * */
    @Override
    public List<UserInfo> getAllUsers() {
        //查询所有用户信息的sql语句，我们可以先在数据库管理工具的查询里测试，然后将语句移植过来
        String sql = "SELECT usertb.user_id,usertb.username,usertb.sex,usertb.age,usertb.address \n" +
                "FROM usertb,user_role_rel,roletb\n" +
                "where usertb.user_id = user_role_rel.user_id and roletb.role_id =user_role_rel.role_id;";

        try {
            //使用结果集接收查询结果
            ResultSet rs = SQLHelper.ExecuteReader(sql,null);
            //新建List存放查询结果
            List<UserInfo> userlist = new ArrayList<>();
            while (rs.next()){
                UserInfo u = new UserInfo();
                u.setUser_id(rs.getInt("user_id"));
                u.setUsername(rs.getString("username"));
                u.setSex(rs.getString("sex"));
                u.setAge(rs.getInt("age"));
                u.setAddress(rs.getString("address"));

                //将用户对象添加到List中
                userlist.add(u);
            }
            //查询成功
            System.out.println("所有用户信息查询成功");
            return userlist;
        }catch (SQLException e){
            System.out.println(e);
        }

        return null;
    }

    /**
     * 修改当前登录用户的密码
     * 输入参数用户id，新密码，
     * @return 受影响的行，大于0则执行更新成功
     * */
    @Override
    public Integer modityUserPassByUserId(UserInfo userInfo) {
        //根据用户id，更新用户密码
        String sql = "update usertb set userpass=? where user_id = ?";

        //添加参数列表
        Object[] param = new Object[]{userInfo.getUserpass(),userInfo.getUser_id()};

        try{
            Integer count = SQLHelper.ExecuteUpdate(sql,param);

            return  count;
        }catch (SQLException e){
            System.out.println(e);
        }

        return null;
    }

    /**
     * 根据用户id获取指定用户的信息进行修改
     * @return 用户基本信息
     * */
    @Override
    public UserInfo getUserInfoById(UserInfo userInfo) {
        //构建sql语句
        String sql = "SELECT usertb.user_id,usertb.username,usertb.sex,usertb.age,usertb.address,roletb.role_id,roletb.rolename " +
                "FROM usertb,roletb,user_role_rel where usertb.user_id = user_role_rel.user_id and roletb.role_id = user_role_rel.role_id " +
                "AND usertb.user_id = ?";

        //添加传递参数user_id
        Object[] param = new Object[]{userInfo.getUser_id()};

        try{
            ResultSet rs = SQLHelper.ExecuteReader(sql,param);
            if(rs.next()){
                UserInfo user= new UserInfo();
                user.setUser_id(rs.getInt("user_id"));
                user.setUsername(rs.getString("username"));
                user.setSex(rs.getString("sex"));
                user.setAge(rs.getInt("age"));
                user.setAddress(rs.getString("address"));
                user.setRole_id(rs.getInt("role_id"));
                user.setRolename(rs.getString("rolename"));

                return user;
            }
        }catch (SQLException e){
            System.out.println(e);
        }
        return null;
    }

    /**
     * 根据用户id修改用户基本信息
     * 参数：用户id,年龄，性别，地址
     * @return 受影响的行，执行成功>0
     * */
    @Override
    public Integer modifyUserInfoById(UserInfo userInfo) {
        //修改用户信息的sql
        String sql = "update usertb set sex=?,age=?,address=? where user_id=?";
        //传入参数
        Object[] param = new Object[]{userInfo.getSex(),userInfo.getAge(),userInfo.getAddress(),userInfo.getUser_id()};

        try {
            Integer count = SQLHelper.ExecuteUpdate(sql,param);
            return count;
        }catch (SQLException e){
            System.out.println(e);
        }
        return 0;
    }

    /**
     * 根据用户id修改用户权限
     * 参数:用户id,role_id
     * @return 受影响的行，执行成功>0
     * */
    @Override
    public Integer modifyUserRoleById(UserInfo userInfo) {
        //更新用户角色关系表
        String sql = "update user_role_rel set role_id=? where user_id=?";
        //传入参数
        Object[] param = new Object[]{userInfo.getRole_id(),userInfo.getUser_id()};

        try {
            Integer count = SQLHelper.ExecuteUpdate(sql,param);
            return count;
        }catch (SQLException e){
            System.out.println(e);
        }
        return 0;
    }

    /**
     * 根据用户id删除用户基本信息表
     * 参数： user_id
     * @return 受影响的行，执行成功>0
     * */
    @Override
    public Integer deleteUserById(UserInfo userInfo) {
        String sql = "delete from usertb where user_id = ?";
        Object[] param = new Object[]{userInfo.getUser_id()};
        try {
            Integer count = SQLHelper.ExecuteUpdate(sql,param);
            return count;
        }catch (SQLException e){
            System.out.println(e);
        }
        return 0;
    }

    /**
     * 根据用户id删除用户权限关系表
     * 参数： user_id
     * @return 受影响的行，执行成功>0
     * */
    @Override
    public Integer deleteUserRoleRelationShip(UserInfo userInfo) {
        String sql = "delete from user_role_rel where user_id = ?";
        Object[] param = new Object[]{userInfo.getUser_id()};
        try {
            Integer count = SQLHelper.ExecuteUpdate(sql,param);
            return count;
        }catch (SQLException e){
            System.out.println(e);
        }
        return 0;
    }
}
